Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Apr 1998 01:05:25 -0700 (PDT)
From:      "Jason K. Fritcher" <jkf@microline.org>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   misc/6329: _thread_flockfile hangs with NULL file pointer.
Message-ID:  <199804170805.BAA22860@sys1.microline.org>

next in thread | raw e-mail | index | archive | help

>Number:         6329
>Category:       misc
>Synopsis:       _thread_flockfile hangs with NULL file pointer.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Apr 17 01:10:14 PDT 1998
>Last-Modified:
>Originator:     Jason K. Fritcher
>Organization:
N/A
>Release:        FreeBSD 2.2.6-STABLE i386
>Environment:

FreeBSD sys1.microline.org 2.2.6-STABLE FreeBSD 2.2.6-STABLE #0: Sun Apr  5
14:20:20 PDT 1998  root@sys1.microline.org:/usr/src/sys/compile/microline i386

>Description:

Calling any function that calls _thread_flockfile with a file pointer that
happens to be NULL, the function will hang, and consume call idle cpu time.

>How-To-Repeat:

Save this to a file, ie blah.c.

#include <pthread.h>
#include <stdio.h>

main()
{
        FILE*   fBlah = NULL;

        fprintf(fBlah, "Blah\n");
}


Then do this:

  gcc -lc_r -o blah blah.c
  ./blah

hangs. Have to 'kill -9' to stop.


But this:

  gcc -o blah blah.c
  ./blah

core dumps as expected.


>Fix:

Apply this patch to /usr/src/lib/libc_r/uthread/uthread_file.c

--- uthread_file.c.old  Sun Jan 21 16:23:18 1996
+++ uthread_file.c      Thu Apr 16 23:51:22 1998
@@ -42,10 +42,12 @@
        int             fd, flags;
        int             status;

-       /* Block signals: */
-       _thread_kern_sig_block(&status);

        if ((fd = fileno(fp)) >= 0) {
+               /* Block signals: */
+               _thread_kern_sig_block(&status);
+
+
                if (fp->_flags & __SRW) {
                        flags = FD_READ | FD_WRITE;
                } else {
@@ -58,9 +60,10 @@

                /* This might fail but POSIX doesn't give a damn. */
                _thread_fd_lock(fd, flags, NULL, fname, lineno);
+
+               /* Unblock signals: */
+               _thread_kern_sig_unblock(status);
        }
-       /* Unblock signals: */
-       _thread_kern_sig_unblock(status);
        return;
 }
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804170805.BAA22860>