From 9a7f65a34e9358633109338f12bb52303c358d35 Mon Sep 17 00:00:00 2001 From: JP Ikaheimonen Date: Mon, 8 Jul 2013 09:02:02 -0400 Subject: [PATCH] Move strerror_r to compat directory The usage of strerror_r is platform dependent. Add new function compat_strerror_r to include/babeltrace/compat/string.h, and hide the platform-dependent usage there. Use the aforementioned header file instead of standard string.h where necessary. [ Updates by Mathieu Desnoyers: fix coding style, fix possible buffer overflow by using strncpy rather than strcpy. ] Signed-off-by: Mathieu Desnoyers --- include/Makefile.am | 1 + include/babeltrace/babeltrace-internal.h | 32 ++------------ include/babeltrace/compat/string.h | 54 ++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 29 deletions(-) create mode 100644 include/babeltrace/compat/string.h diff --git a/include/Makefile.am b/include/Makefile.am index 7bf25391..2d05ef94 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -33,6 +33,7 @@ noinst_HEADERS = \ babeltrace/trace-handle-internal.h \ babeltrace/compat/uuid.h \ babeltrace/compat/memstream.h \ + babeltrace/compat/string.h \ babeltrace/compat/utc.h \ babeltrace/endian.h \ babeltrace/mmap-align.h diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 9b9ffbdf..1f379ee7 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #define PERROR_BUFLEN 200 @@ -81,46 +81,20 @@ extern int babeltrace_verbose, babeltrace_debug; perrorstr, \ ## args) -#if !defined(__linux__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE)) - #define _bt_printf_perror(fp, fmt, args...) \ ({ \ char buf[PERROR_BUFLEN] = "Error in strerror_r()"; \ - strerror_r(errno, buf, sizeof(buf)); \ + compat_strerror_r(errno, buf, sizeof(buf)); \ _bt_printfe(fp, "error", buf, fmt, ## args); \ }) #define _bt_printfl_perror(fp, lineno, fmt, args...) \ ({ \ char buf[PERROR_BUFLEN] = "Error in strerror_r()"; \ - strerror_r(errno, buf, sizeof(buf)); \ + compat_strerror_r(errno, buf, sizeof(buf)); \ _bt_printfle(fp, "error", lineno, buf, fmt, ## args); \ }) -#else - -/* - * Version using GNU strerror_r, for linux with appropriate defines. - */ - -#define _bt_printf_perror(fp, fmt, args...) \ - ({ \ - char *buf; \ - char tmp[PERROR_BUFLEN] = "Error in strerror_r()"; \ - buf = strerror_r(errno, tmp, sizeof(tmp)); \ - _bt_printfe(fp, "error", buf, fmt, ## args); \ - }) - -#define _bt_printfl_perror(fp, lineno, fmt, args...) \ - ({ \ - char *buf; \ - char tmp[PERROR_BUFLEN] = "Error in strerror_r()"; \ - buf = strerror_r(errno, tmp, sizeof(tmp)); \ - _bt_printfle(fp, "error", lineno, buf, fmt, ## args); \ - }) - -#endif - /* printf without lineno information */ #define printf_fatal(fmt, args...) \ _bt_printf(stderr, "fatal", fmt, ## args) diff --git a/include/babeltrace/compat/string.h b/include/babeltrace/compat/string.h new file mode 100644 index 00000000..5d6a0632 --- /dev/null +++ b/include/babeltrace/compat/string.h @@ -0,0 +1,54 @@ +#ifndef _BABELTRACE_COMPAT_STRING_H +#define _BABELTRACE_COMPAT_STRING_H + +/* + * Copyright (C) 2013 Mathieu Desnoyers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include + +#if !defined(__linux__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE)) + +/* XSI-compliant strerror_r */ +static inline +int compat_strerror_r(int errnum, char *buf, size_t buflen) +{ + return strerror_r(errnum, buf, buflen); +} + +#else + +/* GNU-compliant strerror_r */ +static inline +int compat_strerror_r(int errnum, char *buf, size_t buflen) +{ + char *retbuf; + + retbuf = strerror_r(errnum, buf, buflen); + if (retbuf != buf) + strncpy(buf, retbuf, buflen); + buf[buflen - 1] = '\0'; + return 0; +} + +#endif + +#endif /* _BABELTRACE_COMPAT_STRING_H */ -- 2.34.1