From patchwork Mon Feb 8 16:37:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 10761 Received: (qmail 40024 invoked by alias); 8 Feb 2016 16:37:19 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 40006 invoked by uid 89); 8 Feb 2016 16:37:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=3196, 319, 6, 5259, precautions X-HELO: mx1.redhat.com To: GNU C Library From: Florian Weimer Subject: [PATCH] Deprecate readdir_r, readdir64_r [BZ #19056] Message-ID: <56B8C43A.4040705@redhat.com> Date: Mon, 8 Feb 2016 17:37:14 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 This patch adds __attribute__ ((deprecated)) to . (This is 2.24 material, of course.) Florian 2016-02-08 Florian Weimer [BZ #19056] * dirent/dirent.h (readdir_r, readdir64_r): Mark as deprecated. * manual/filesys.texi (Reading/Closing Directory): Mention deprecaion. * posix/tst-dir.c (main): Disable deprecation warning in test. diff --git a/NEWS b/NEWS index 93c09be..56b8f44 100644 --- a/NEWS +++ b/NEWS @@ -73,6 +73,9 @@ Version 2.23 C Library is GCC 4.7. Older GCC versions, and non-GNU compilers, can still be used to compile programs using the GNU C Library. +* The readdir_r and readdir64_r functions are deprecated. It is recommended + to use readdir and readdir64 instead. + Security related changes: * The nan, nanf and nanl functions no longer have unbounded stack usage diff --git a/dirent/dirent.h b/dirent/dirent.h index 9a4b6bf..e6c36b1 100644 --- a/dirent/dirent.h +++ b/dirent/dirent.h @@ -183,14 +183,15 @@ extern struct dirent64 *readdir64 (DIR *__dirp) __nonnull ((1)); extern int readdir_r (DIR *__restrict __dirp, struct dirent *__restrict __entry, struct dirent **__restrict __result) - __nonnull ((1, 2, 3)); + __nonnull ((1, 2, 3)) __attribute_deprecated__; # else # ifdef __REDIRECT extern int __REDIRECT (readdir_r, (DIR *__restrict __dirp, struct dirent *__restrict __entry, struct dirent **__restrict __result), - readdir64_r) __nonnull ((1, 2, 3)); + readdir64_r) + __nonnull ((1, 2, 3)) __attribute_deprecated__; # else # define readdir_r readdir64_r # endif @@ -200,7 +201,7 @@ extern int __REDIRECT (readdir_r, extern int readdir64_r (DIR *__restrict __dirp, struct dirent64 *__restrict __entry, struct dirent64 **__restrict __result) - __nonnull ((1, 2, 3)); + __nonnull ((1, 2, 3)) __attribute_deprecated__; # endif #endif /* POSIX or misc */ diff --git a/manual/filesys.texi b/manual/filesys.texi index 972e106..b323664 100644 --- a/manual/filesys.texi +++ b/manual/filesys.texi @@ -525,8 +525,9 @@ locking. Like @code{readdir} it returns the next entry from the directory. To prevent conflicts between simultaneously running threads the result is stored inside the @var{entry} object. -@strong{Portability Note:} It is recommended to use @code{readdir} -instead of @code{readdir_r} for the following reasons: +@strong{Portability Note:} @code{readdir_r} is deprecated. It is +recommended to use @code{readdir} instead of @code{readdir_r} for the +following reasons: @itemize @bullet @item @@ -604,10 +605,10 @@ In all other aspects this function is equivalent to @code{readdir}. @comment LFS @deftypefun int readdir64_r (DIR *@var{dirstream}, struct dirent64 *@var{entry}, struct dirent64 **@var{result}) @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} -The @code{readdir64_r} function is equivalent to the @code{readdir_r} -function except that it takes parameters of base type @code{struct -dirent64} instead of @code{struct dirent} in the second and third -position. The same precautions mentioned in the documentation of +The deprecated @code{readdir64_r} function is equivalent to the +@code{readdir_r} function except that it takes parameters of base type +@code{struct dirent64} instead of @code{struct dirent} in the second and +third position. The same precautions mentioned in the documentation of @code{readdir_r} also apply here. @end deftypefun diff --git a/posix/tst-dir.c b/posix/tst-dir.c index 8897f8e..d0e4878 100644 --- a/posix/tst-dir.c +++ b/posix/tst-dir.c @@ -319,6 +319,10 @@ main (int argc, char *argv[]) exit (1); } + /* The test below covers the deprecated readdir64_r function. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); + /* Try to find the new directory. */ rewinddir (dir1); while (readdir64_r (dir1, &direntbuf.d, &d) == 0 && d != NULL) @@ -351,6 +355,8 @@ main (int argc, char *argv[]) } } + DIAG_POP_NEEDS_COMMENT; + if (d == NULL) { printf ("haven't found new directory \"%s\"\n", buf); @@ -439,6 +445,10 @@ main (int argc, char *argv[]) result = 1; } + /* The test below covers the deprecated readdir64_r function. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); + /* We now should have a directory and a file in the new directory. */ rewinddir (dir2); while (readdir64_r (dir2, &direntbuf.d, &d) == 0 && d != NULL) @@ -492,6 +502,8 @@ main (int argc, char *argv[]) } } + DIAG_POP_NEEDS_COMMENT; + if (stat64 ("does-not-exist", &st1) >= 0) { puts ("stat for unexisting file did not fail");