All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the
       [not found] <E1EZ6jH-0002pi-4u@xenbits.xensource.com>
@ 2005-11-07 17:15 ` Anthony Liguori
  2005-11-07 17:23   ` Ewan Mellor
  2005-11-07 17:24   ` Hollis Blanchard
  0 siblings, 2 replies; 4+ messages in thread
From: Anthony Liguori @ 2005-11-07 17:15 UTC (permalink / raw)
  To: xen-devel; +Cc: Ewan Mellor

Xen patchbot -unstable wrote:

> 
>+void reopen_log()
>+{
>+	if (!tracefile)
>+		return;
>+
>+	if (tracefd > 0)
>+		close(tracefd);
>+	tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600);
>+	if (tracefd < 0) {
>+		perror("Could not open tracefile");
>+		return;
>+	}
>+	write(tracefd, "\n***\n", strlen("\n***\n"));
>+}
>+
>  
>
perror and strlen are not safe to call from a signal handler.

I suggest just removing the perror call altogether and replacing strlen 
with sizeof() - 1.

Regards,

Anthony Liguori

> static bool write_messages(struct connection *conn)
> {
> 	int ret;
>@@ -1498,11 +1514,7 @@
> 			outputpid = true;
> 			break;
> 		case 'T':
>-			tracefd = open(optarg, O_WRONLY|O_CREAT|O_APPEND, 0600);
>-			if (tracefd < 0)
>-				barf_perror("Could not open tracefile %s",
>-					    optarg);
>-                        write(tracefd, "\n***\n", strlen("\n***\n"));
>+			tracefile = optarg;
> 			break;
> 		case 'V':
> 			verbose = true;
>@@ -1511,6 +1523,8 @@
> 	}
> 	if (optind != argc)
> 		barf("%s: No arguments desired", argv[0]);
>+
>+	reopen_log();
> 
> 	if (dofork) {
> 		openlog("xenstored", 0, LOG_DAEMON);
>@@ -1577,6 +1591,8 @@
> 		close(STDOUT_FILENO);
> 		close(STDERR_FILENO);
> 	}
>+
>+	signal(SIGHUP, reopen_log);
> 
> #ifdef TESTING
> 	signal(SIGUSR1, stop_failtest);
>
>_______________________________________________
>Xen-changelog mailing list
>Xen-changelog@lists.xensource.com
>http://lists.xensource.com/xen-changelog
>
>  
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the
  2005-11-07 17:15 ` [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the Anthony Liguori
@ 2005-11-07 17:23   ` Ewan Mellor
  2005-11-07 17:24   ` Hollis Blanchard
  1 sibling, 0 replies; 4+ messages in thread
From: Ewan Mellor @ 2005-11-07 17:23 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: xen-devel

On Mon, Nov 07, 2005 at 11:15:34AM -0600, Anthony Liguori wrote:

> Xen patchbot -unstable wrote:
> 
> >
> >+void reopen_log()
> >+{
> >+	if (!tracefile)
> >+		return;
> >+
> >+	if (tracefd > 0)
> >+		close(tracefd);
> >+	tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600);
> >+	if (tracefd < 0) {
> >+		perror("Could not open tracefile");
> >+		return;
> >+	}
> >+	write(tracefd, "\n***\n", strlen("\n***\n"));
> >+}
> >+
> > 
> >
> perror and strlen are not safe to call from a signal handler.

OK, I'll believe you about perror -  thanks for spotting that.

Why, though, should strlen not be safe?  Even if strlen(constant) doesn't turn
into a constant integer at compile-time, which I rather hope that it would,
why in any case would strlen be a problem?

Ewan.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Re: [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the
  2005-11-07 17:15 ` [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the Anthony Liguori
  2005-11-07 17:23   ` Ewan Mellor
@ 2005-11-07 17:24   ` Hollis Blanchard
  2005-11-07 17:36     ` Anthony Liguori
  1 sibling, 1 reply; 4+ messages in thread
From: Hollis Blanchard @ 2005-11-07 17:24 UTC (permalink / raw)
  To: xen-devel; +Cc: Ewan Mellor

On Monday 07 November 2005 11:15, Anthony Liguori wrote:
> >+void reopen_log()
> >+{
> >+      if (!tracefile)
> >+              return;
> >+
> >+      if (tracefd > 0)
> >+              close(tracefd);
> >+      tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600);
> >+      if (tracefd < 0) {
> >+              perror("Could not open tracefile");
> >+              return;
> >+      }
> >+      write(tracefd, "\n***\n", strlen("\n***\n"));
> >+}
>
> perror and strlen are not safe to call from a signal handler.
>
> I suggest just removing the perror call altogether and replacing strlen
> with sizeof() - 1.

I'm really not sure how strlen could be non-threadsafe. I don't care if it's 
not in your list; your list doesn't include strtok_r either, and that is 
explicitly thread-safe. :-P

However, in addition to perror, another thread could try to use tracefd 
between the close and the open. You'd probably want to do something like:
	oldfd = tracefd;
	newfd = open();
	if (newfd < 0) {
		...
	}
	tracefd = newfd;
	close(oldfd);

Finally, you really should do error-checking on close(). See the close(2) man 
page...

-- 
Hollis Blanchard
IBM Linux Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Re: [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the
  2005-11-07 17:24   ` Hollis Blanchard
@ 2005-11-07 17:36     ` Anthony Liguori
  0 siblings, 0 replies; 4+ messages in thread
From: Anthony Liguori @ 2005-11-07 17:36 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: xen-devel, Ewan Mellor

Hollis Blanchard wrote:

>On Monday 07 November 2005 11:15, Anthony Liguori wrote:
>  
>
>>perror and strlen are not safe to call from a signal handler.
>>
>>I suggest just removing the perror call altogether and replacing strlen
>>with sizeof() - 1.
>>    
>>
>
>I'm really not sure how strlen could be non-threadsafe. I don't care if it's 
>not in your list; your list doesn't include strtok_r either, and that is 
>explicitly thread-safe. :-P
>  
>
So re-reading the manpage, the list of safe functions is a POSIX-ism.  
That's perhaps why the thread-safe string functions aren't there since 
those are defined by ANSI not POSIX.

Regards,

Anthony Liguori

>However, in addition to perror, another thread could try to use tracefd 
>between the close and the open. You'd probably want to do something like:
>	oldfd = tracefd;
>	newfd = open();
>	if (newfd < 0) {
>		...
>	}
>	tracefd = newfd;
>	close(oldfd);
>
>Finally, you really should do error-checking on close(). See the close(2) man 
>page...
>
>  
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-11-07 17:36 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <E1EZ6jH-0002pi-4u@xenbits.xensource.com>
2005-11-07 17:15 ` [Xen-changelog] Make xenstored reopen its trace file on SIGHUP. This allows one to rotate the Anthony Liguori
2005-11-07 17:23   ` Ewan Mellor
2005-11-07 17:24   ` Hollis Blanchard
2005-11-07 17:36     ` Anthony Liguori

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.