summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-01 08:35:14 +0100
committerThomas Haller <thaller@redhat.com>2019-02-09 08:54:33 +0100
commit8b4dff1ef76c581d170d995c1861ce184fac7460 (patch)
tree8dc6f583f62731926af7a44f31868f306554d654
parent791290c4d556834180121fbfc838e1d1e9abc3c5 (diff)
downloadNetworkManager-th/errno.tar.gz
shared: use nm_strerror_native_r() in lower layersth/errno
Subsequent calls to nm_strerror_native() overwrite the previous buffer. That is potentially dangerious. At least functions in shared/nm-utils (which are lower-layer utilities) should not do that and instead use a stack-local buffer. That is because these functions should not make assumptions about the way they are called. On the other end, nmcli passing the return-value of nm_strerror_native() to g_print() is clearly OK because the higher layers are in control of when the call nm_strerror_native() -- by relying that lower layers don't interfere.
-rw-r--r--shared/nm-utils/nm-io-utils.c21
-rw-r--r--shared/nm-utils/nm-shared-utils.h34
2 files changed, 32 insertions, 23 deletions
diff --git a/shared/nm-utils/nm-io-utils.c b/shared/nm-utils/nm-io-utils.c
index 7a9b8b7752..ce1fee6862 100644
--- a/shared/nm-utils/nm-io-utils.c
+++ b/shared/nm-utils/nm-io-utils.c
@@ -40,8 +40,9 @@ _get_contents_error (GError **error, int errsv, const char *format, ...)
nm_assert (NM_ERRNO_NATIVE (errsv));
if (error) {
- char *msg;
+ gs_free char *msg = NULL;
va_list args;
+ char bstrerr[NM_STRERROR_BUFSIZE];
va_start (args, format);
msg = g_strdup_vprintf (format, args);
@@ -50,8 +51,8 @@ _get_contents_error (GError **error, int errsv, const char *format, ...)
G_FILE_ERROR,
g_file_error_from_errno (errsv),
"%s: %s",
- msg, nm_strerror_native (errsv));
- g_free (msg);
+ msg,
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
}
return -errsv;
}
@@ -289,6 +290,7 @@ nm_utils_file_get_contents (int dirfd,
{
int fd;
int errsv;
+ char bstrerr[NM_STRERROR_BUFSIZE];
g_return_val_if_fail (filename && filename[0], -EINVAL);
@@ -302,7 +304,7 @@ nm_utils_file_get_contents (int dirfd,
g_file_error_from_errno (errsv),
"Failed to open file \"%s\" with openat: %s",
filename,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return -NM_ERRNO_NATIVE (errsv);
}
} else {
@@ -315,7 +317,7 @@ nm_utils_file_get_contents (int dirfd,
g_file_error_from_errno (errsv),
"Failed to open file \"%s\": %s",
filename,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return -NM_ERRNO_NATIVE (errsv);
}
}
@@ -346,6 +348,7 @@ nm_utils_file_set_contents (const char *filename,
int errsv;
gssize s;
int fd;
+ char bstrerr[NM_STRERROR_BUFSIZE];
g_return_val_if_fail (filename, FALSE);
g_return_val_if_fail (contents || !length, FALSE);
@@ -364,7 +367,7 @@ nm_utils_file_set_contents (const char *filename,
g_file_error_from_errno (errsv),
"failed to create file %s: %s",
tmp_name,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return FALSE;
}
@@ -383,7 +386,7 @@ nm_utils_file_set_contents (const char *filename,
g_file_error_from_errno (errsv),
"failed to write to file %s: %s",
tmp_name,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return FALSE;
}
@@ -412,7 +415,7 @@ nm_utils_file_set_contents (const char *filename,
g_file_error_from_errno (errsv),
"failed to fsync %s: %s",
tmp_name,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return FALSE;
}
}
@@ -428,7 +431,7 @@ nm_utils_file_set_contents (const char *filename,
"failed to rename %s to %s: %s",
tmp_name,
filename,
- nm_strerror_native (errsv));
+ nm_strerror_native_r (errsv, bstrerr, sizeof (bstrerr)));
return FALSE;
}
diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h
index fd2019349a..ce308ef67c 100644
--- a/shared/nm-utils/nm-shared-utils.h
+++ b/shared/nm-utils/nm-shared-utils.h
@@ -700,20 +700,26 @@ nm_utils_error_set_literal (GError **error, int error_code, const char *literal)
g_set_error ((error), NM_UTILS_ERROR, error_code, __VA_ARGS__)
#define nm_utils_error_set_errno(error, errsv, fmt, ...) \
- g_set_error ((error), \
- NM_UTILS_ERROR, \
- NM_UTILS_ERROR_UNKNOWN, \
- fmt, \
- ##__VA_ARGS__, \
- nm_strerror_native (({ \
- const int _errsv = (errsv); \
- \
- ( _errsv >= 0 \
- ? _errsv \
- : ( G_UNLIKELY (_errsv == G_MININT) \
- ? G_MAXINT \
- : -errsv)); \
- })))
+ G_STMT_START { \
+ char _bstrerr[NM_STRERROR_BUFSIZE]; \
+ \
+ g_set_error ((error), \
+ NM_UTILS_ERROR, \
+ NM_UTILS_ERROR_UNKNOWN, \
+ fmt, \
+ ##__VA_ARGS__, \
+ nm_strerror_native_r (({ \
+ const int _errsv = (errsv); \
+ \
+ ( _errsv >= 0 \
+ ? _errsv \
+ : ( G_UNLIKELY (_errsv == G_MININT) \
+ ? G_MAXINT \
+ : -errsv)); \
+ }), \
+ _bstrerr, \
+ sizeof (_bstrerr))); \
+ } G_STMT_END
/*****************************************************************************/