(__recv_chk_warn, __recvfrom_chk_warn): New aliases with __warnattr.
authordrepper <drepper>
Wed, 26 Sep 2007 20:44:32 +0000 (20:44 +0000)
committerdrepper <drepper>
Wed, 26 Sep 2007 20:44:32 +0000 (20:44 +0000)
(recv, recvfrom): Call __*_chk_warn instead of __*_chk if compile
time detectable overflow is found.

socket/bits/socket2.h

index 9fac756..5c4cb47 100644 (file)
@@ -25,13 +25,23 @@ extern ssize_t __recv_chk (int __fd, void *__buf, size_t __n, size_t __buflen,
                           int __flags);
 extern ssize_t __REDIRECT (__recv_alias, (int __fd, void *__buf, size_t __n,
                                          int __flags), recv);
+extern ssize_t __REDIRECT (__recv_chk_warn,
+                          (int __fd, void *__buf, size_t __n, size_t __buflen,
+                           int __flags), __recv_chk)
+     __warnattr ("recv called with bigger length than size of destination "
+                "buffer");
 
 __extern_always_inline ssize_t
 recv (int __fd, void *__buf, size_t __n, int __flags)
 {
-  if (__bos0 (__buf) != (size_t) -1
-      && (!__builtin_constant_p (__n) || __n > __bos0 (__buf)))
-    return __recv_chk (__fd, __buf, __n, __bos0 (__buf), __flags);
+  if (__bos0 (__buf) != (size_t) -1)
+    {
+      if (!__builtin_constant_p (__n))
+       return __recv_chk (__fd, __buf, __n, __bos0 (__buf), __flags);
+
+      if (__n > __bos0 (__buf))
+       return __recv_chk_warn (__fd, __buf, __n, __bos0 (__buf), __flags);
+    }
   return __recv_alias (__fd, __buf, __n, __flags);
 }
 
@@ -43,14 +53,26 @@ extern ssize_t __REDIRECT (__recvfrom_alias,
                           (int __fd, void *__restrict __buf, size_t __n,
                            int __flags, __SOCKADDR_ARG __addr,
                            socklen_t *__restrict __addr_len), recvfrom);
+extern ssize_t __REDIRECT (__recvfrom_chk_warn,
+                          (int __fd, void *__restrict __buf, size_t __n,
+                           size_t __buflen, int __flags,
+                           __SOCKADDR_ARG __addr,
+                           socklen_t *__restrict __addr_len), __recvfrom_chk)
+     __warnattr ("recvfrom called with bigger length than size of "
+                "destination buffer");
 
 __extern_always_inline ssize_t
 recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,
          __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
 {
-  if (__bos0 (__buf) != (size_t) -1
-      && (!__builtin_constant_p (__n) || __n > __bos0 (__buf)))
-    return __recvfrom_chk (__fd, __buf, __n, __bos0 (__buf), __flags,
-                          __addr, __addr_len);
+  if (__bos0 (__buf) != (size_t) -1)
+    {
+      if (!__builtin_constant_p (__n))
+       return __recvfrom_chk (__fd, __buf, __n, __bos0 (__buf), __flags,
+                              __addr, __addr_len);
+      if (__n > __bos0 (__buf))
+       return __recvfrom_chk_warn (__fd, __buf, __n, __bos0 (__buf), __flags,
+                                   __addr, __addr_len);
+    }
   return __recvfrom_alias (__fd, __buf, __n, __flags, __addr, __addr_len);
 }