From 8897b4ea3b14cce62493c9f439c841a3f131a6ae Mon Sep 17 00:00:00 2001 From: Bastien ROUCARIES Date: Tue, 11 Jan 2011 18:32:19 +0100 Subject: [PATCH 3/3] Bail out early in case of ENOMEM in openat_proc_name Return early in caller functions of openat_proc_name in case of unexpected error --- lib/at-func.c | 4 ++++ lib/at-func2.c | 12 ++++++++++++ lib/openat-proc.c | 10 ++++++++-- lib/openat.c | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/at-func.c b/lib/at-func.c index f7e2667..7dadf54 100644 --- a/lib/at-func.c +++ b/lib/at-func.c @@ -89,6 +89,10 @@ AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS) { char proc_buf[OPENAT_BUFFER_SIZE]; char *proc_file = openat_proc_name (proc_buf, fd, file); + + if (!proc_file && errno != ENOTSUP) + return FUNC_FAIL; + if (proc_file) { FUNC_RESULT proc_result = CALL_FUNC (proc_file); diff --git a/lib/at-func2.c b/lib/at-func2.c index 1cb55cc..1c3610b 100644 --- a/lib/at-func2.c +++ b/lib/at-func2.c @@ -97,12 +97,24 @@ at_func2 (int fd1, char const *file1, char *proc_file1 = ((fd1 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file1)) ? (char *) file1 : openat_proc_name (proc_buf1, fd1, file1)); + + if (!proc_file1 && errno != ENOTSUP) + return -1; + if (proc_file1) { char proc_buf2[OPENAT_BUFFER_SIZE]; char *proc_file2 = ((fd2 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file2)) ? (char *) file2 : openat_proc_name (proc_buf2, fd2, file2)); + + if (!proc_file2 && errno != ENOTSUP) + { + if (proc_file1 != proc_buf1 && proc_file1 != file1) + free(proc_file1); + return -1; + } + if (proc_file2) { int proc_result = func (proc_file1, proc_file2); diff --git a/lib/openat-proc.c b/lib/openat-proc.c index 9bd88bf..c945c1c 100644 --- a/lib/openat-proc.c +++ b/lib/openat-proc.c @@ -93,13 +93,19 @@ openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file) } if (proc_status < 0) - return NULL; + { + errno = ENOTSUP; + return NULL; + } else { size_t bufsize = PROC_SELF_FD_NAME_SIZE_BOUND (strlen (file)); char *result = (bufsize < OPENAT_BUFFER_SIZE ? buf : malloc (bufsize)); if (NULL == result) - return NULL; + { + errno = ENOMEM; + return NULL; + } sprintf (result, PROC_SELF_FD_FORMAT, fd, file); return result; } diff --git a/lib/openat.c b/lib/openat.c index 64b1dca..477abf2 100644 --- a/lib/openat.c +++ b/lib/openat.c @@ -193,6 +193,10 @@ openat_permissive (int fd, char const *file, int flags, mode_t mode, { char buf[OPENAT_BUFFER_SIZE]; char *proc_file = openat_proc_name (buf, fd, file); + + if (!proc_file && errno != ENOTSUP) + return -1; + if (proc_file) { int open_result = open (proc_file, flags, mode); -- 1.7.1