Strange fopen() behaviour (was: xsane patch to maintainer)

2001-02-05 Thread Brian Somers

 Hi,
 
 Would you mind if I commit the attached patch for the xsane port ?  
 It makes sense - rather than dropping a core when fopen() fails (and 
 fclose() is called with a NULL arg).  It happens when your home 
 directory isn't writable :-/

I've cc'd -current as I think something more sinister is going on.  
To recap, I'm having trouble running xsane on -current from about two 
days ago.  fopen() is failing...

The attached patch exposes more about what's wrong.  Interestingly 
enough, the file it's trying to create is in /tmp (mode 1777, 
separate filesystem), and according to truss:

lstat("/tmp//preview-level-0-15-b924dc",0xbfbfe894) ERR#2 'No such file or directory'
umask(0x7f)  = 7 (0x7)
/tmp//preview-level-0-15-b924dc17767-microtek:_dev_scanner.ppm: could not create for 
preview-level 0: No such file or directory
write(2,0xbfbfe48c,128)  = 128 (0x80)
getuid() = 15 (0xf)
lstat("/tmp//preview-level-1-15-jNO6zx",0xbfbfe894) ERR#2 'No such file or directory'
umask(0x7f)  = 127 (0x7f)
/tmp//preview-level-1-15-jNO6zx09158-microtek:_dev_scanner.ppm: could not create for 
preview-level 1: No such file or directory
write(2,0xbfbfe48c,128)  = 128 (0x80)
getuid() = 15 (0xf)
lstat("/tmp//preview-level-2-15-CO6k7w",0xbfbfe894) ERR#2 'No such file or directory'
umask(0x7f)  = 127 (0x7f)
break(0x8134000) = 0 (0x0)
/tmp//preview-level-2-15-CO6k7w39017-microtek:_dev_scanner.ppm: could not create for 
preview-level 2: No such file or directory
write(2,0xbfbfe48c,128)  = 128 (0x80)

fopen() is failing after calling lstat() (I assume via _open()) !!!  
As if the "wb" didn't mean O_CREAT ??!?  Very strange.

Anyway, here's the patch if you're interested.  I'll look into things 
further on Wednesday.

Cheers.
-- 
Brian [EMAIL PROTECTED]brian@[uk.]FreeBSD.org
  http://www.Awfulhak.org   brian@[uk.]OpenBSD.org
Don't _EVER_ lose your sense of humour !



--- src/xsane-preview.c.origSun Jan 14 15:35:06 2001
+++ src/xsane-preview.c Tue Feb  6 03:03:18 2001
@@ -2802,6 +2802,7 @@
  int i;
  char buf[256];
  char filename[PATH_MAX];
+ FILE *fp;
 
   DBG(DBG_proc, "preview_new\n");
 
@@ -2830,9 +2831,17 @@
 if (preview_make_image_path(p, sizeof(filename), filename, i)=0)
 {
   umask(0177); /* create temporary file with "-rw---" 
permissions */
-  fclose(fopen(filename, "wb"));   /* make sure file exists, b = binary mode for 
win32 */
-  umask(XSANE_DEFAULT_UMASK);  /* define new file permissions */
-  p-filename[i] = strdup(filename);/* store filename */
+  fp = fopen(filename, "wb");  /* make sure file exists, b = binary mode for 
+win32 */
+  if (fp == NULL) {
+fprintf(stderr, "%s: could not create for preview-level %d: %s\n", filename, 
+i, strerror(errno));
+p-filename[i] = NULL;
+  }
+  else
+  {
+fclose(fp);
+umask(XSANE_DEFAULT_UMASK);/* define new file permissions */
+p-filename[i] = strdup(filename);/* store filename */
+  }
 }
 else
 {



Re: Strange fopen() behaviour (was: xsane patch to maintainer)

2001-02-05 Thread Andrea Campi

 lstat("/tmp//preview-level-0-15-b924dc",0xbfbfe894) ERR#2 'No such file or directory'
 ^^

surely this is not nice!! My guess is that the double slash is confusing
everything...

Anyway, I'm more interested in below:

 @@ -2830,9 +2831,17 @@
  if (preview_make_image_path(p, sizeof(filename), filename, i)=0)
  {
umask(0177);   /* create temporary file with "-rw---" 
permissions */
 -  fclose(fopen(filename, "wb")); /* make sure file exists, b = binary mode for 
win32 */
 -  umask(XSANE_DEFAULT_UMASK);/* define new file permissions */
 -  p-filename[i] = strdup(filename);/* store filename */
 +  fp = fopen(filename, "wb");/* make sure file exists, b = binary mode for 
win32 */
 +  if (fp == NULL) {
 +fprintf(stderr, "%s: could not create for preview-level %d: %s\n", 
filename, i, strerror(errno));
 +p-filename[i] = NULL;
 +  }
 +  else
 +  {
 +fclose(fp);
 +umask(XSANE_DEFAULT_UMASK);  /* define new file permissions */
 +p-filename[i] = strdup(filename);/* store filename */
 +  }


I REALLY hope above code is NEVER EVER run as root, as this is a great
recipe for interesting failures...

/me hands Brian a few symlinks to /etc/master.passwd from /tmp

If you are patching it, make sure you get it right, you'd do
everybody a big favor.

Bye,
Andrea

-- 
It is easier to fix Unix than to live with NT.


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message