OSDN Git Service

do not save/restore errno around free() calls
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 5 Sep 2009 21:37:40 +0000 (23:37 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 5 Sep 2009 21:37:40 +0000 (23:37 +0200)
In any non-buggy program free() does not fail.
And when it fails in a buggy program, the failure
is usually fatal (heap corruption and segfault).

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libc/inet/if_index.c
libc/inet/ifaddrs.c
libc/misc/dirent/opendir.c
librt/shm.c

index 4100bbf..090b52a 100644 (file)
 
 #include "netlinkaccess.h"
 
-/* Experimentally off - libc_hidden_proto(strncpy) */
-/* Experimentally off - libc_hidden_proto(strdup) */
-/* libc_hidden_proto(ioctl) */
-/* libc_hidden_proto(close) */
-#if __ASSUME_NETLINK_SUPPORT
-/* Experimentally off - libc_hidden_proto(strndup) */
-#endif
-
 extern int __opensock(void) attribute_hidden;
 
 /* libc_hidden_proto(if_nametoindex) */
@@ -62,10 +54,11 @@ if_nametoindex(const char* ifname)
   strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl (fd, SIOCGIFINDEX, &ifr) < 0)
     {
-      int saved_errno = errno;
+      // close never fails here, fd is just a unconnected socket
+      //int saved_errno = errno;
       close(fd);
-      if (saved_errno == EINVAL)
-       __set_errno(ENOSYS);
+      //if (saved_errno == EINVAL)
+      //  __set_errno(ENOSYS);
       return 0;
     }
 
index 1d54d51..77ca7ce 100644 (file)
@@ -81,7 +81,6 @@ void
 __netlink_free_handle (struct netlink_handle *h)
 {
   struct netlink_res *ptr;
-  int saved_errno = errno;
 
   ptr = h->nlm_list;
   while (ptr != NULL)
@@ -89,11 +88,9 @@ __netlink_free_handle (struct netlink_handle *h)
       struct netlink_res *tmpptr;
 
       tmpptr = ptr->next;
-      free (ptr);
+      free (ptr); /* doesn't affect errno */
       ptr = tmpptr;
     }
-
-  __set_errno (saved_errno);
 }
 
 
index 70b3065..672ef15 100644 (file)
@@ -87,16 +87,17 @@ DIR *opendir(const char *name)
        fd = open(name, O_RDONLY|O_NDELAY|O_DIRECTORY|O_CLOEXEC);
        if (fd < 0)
                return NULL;
-
        /* Note: we should check to make sure that between the stat() and open()
         * call, 'name' didnt change on us, but that's only if O_DIRECTORY isnt
         * defined and since Linux has supported it for like ever, i'm not going
         * to worry about it right now (if ever). */
+
        if (fstat(fd, &statbuf) < 0) {
-               int saved_errno;
-               saved_errno = errno;
+               // this close() never fails
+               //int saved_errno;
+               //saved_errno = errno;
                close(fd);
-               __set_errno(saved_errno);
+               //__set_errno(saved_errno);
                return NULL;
        }
 
index f0a9740..dd21324 100644 (file)
@@ -25,8 +25,8 @@
  * Returns a malloc'ed buffer containing the OS specific path
  * to the shm filename or NULL upon failure.
  */
-static __attribute_noinline__ char* get_shm_name(const char*name) __nonnull((1));
-static char* get_shm_name(const char*name)
+static __attribute_noinline__ char* get_shm_name(const char *name) __nonnull((1));
+static char* get_shm_name(const char *name)
 {
        char *path;
        int i;
@@ -57,7 +57,7 @@ static char* get_shm_name(const char*name)
 
 int shm_open(const char *name, int oflag, mode_t mode)
 {
-       int fd, old_errno;
+       int fd;
        char *shm_name = get_shm_name(name);
 
        /* Stripped multiple '/' from start; may have set errno properly */
@@ -83,23 +83,19 @@ int shm_open(const char *name, int oflag, mode_t mode)
                //}
        }
 #endif
-       old_errno = errno;
-       free(shm_name);
-       errno = old_errno;
+       free(shm_name); /* doesn't affect errno */
        return fd;
 }
 
 int shm_unlink(const char *name)
 {
        char *shm_name = get_shm_name(name);
-       int ret, old_errno;
+       int ret;
 
        /* Stripped multiple '/' from start; may have set errno properly */
        if (shm_name == NULL)
                return -1;
        ret = unlink(shm_name);
-       old_errno = errno;
-       free(shm_name);
-       errno = old_errno;
+       free(shm_name); /* doesn't affect errno */
        return ret;
 }