summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-10-24 21:00:15 +0200
committerLennart Poettering <lennart@poettering.net>2018-10-24 21:00:15 +0200
commit87f54463117654af48d6027986c2b21831d41616 (patch)
tree39c85be4d15ebf142c380a1fe4881ca4bc0ba4da /src
parent7388cea30d676c4c2f8cb803f28d16470b35d015 (diff)
downloadsystemd-87f54463117654af48d6027986c2b21831d41616.tar.gz
systemd-87f54463117654af48d6027986c2b21831d41616.tar.bz2
systemd-87f54463117654af48d6027986c2b21831d41616.zip
string-util: introduce explicit_zero_safe()
The only real difference is that this wrapper can deal with NULL pointer arguments, but only if the length is also zero. CID 1396277
Diffstat (limited to 'src')
-rw-r--r--src/basic/string-util.c9
-rw-r--r--src/basic/string-util.h11
-rw-r--r--src/reply-password/reply-password.c2
-rw-r--r--src/shared/ask-password-api.c14
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c4
5 files changed, 25 insertions, 15 deletions
diff --git a/src/basic/string-util.c b/src/basic/string-util.c
index a3be35847d..05469ac01f 100644
--- a/src/basic/string-util.c
+++ b/src/basic/string-util.c
@@ -1059,8 +1059,11 @@ typedef void *(*memset_t)(void *,int,size_t);
static volatile memset_t memset_func = memset;
-void explicit_bzero(void *p, size_t l) {
- memset_func(p, '\0', l);
+void* explicit_bzero_safe(void *p, size_t l) {
+ if (l > 0)
+ memset_func(p, '\0', l);
+
+ return p;
}
#endif
@@ -1070,7 +1073,7 @@ char* string_erase(char *x) {
/* A delicious drop of snake-oil! To be called on memory where
* we stored passphrases or so, after we used them. */
- explicit_bzero(x, strlen(x));
+ explicit_bzero_safe(x, strlen(x));
return x;
}
diff --git a/src/basic/string-util.h b/src/basic/string-util.h
index 2d9788ac13..ce9d429430 100644
--- a/src/basic/string-util.h
+++ b/src/basic/string-util.h
@@ -198,8 +198,15 @@ static inline void *memmem_safe(const void *haystack, size_t haystacklen, const
return memmem(haystack, haystacklen, needle, needlelen);
}
-#if !HAVE_EXPLICIT_BZERO
-void explicit_bzero(void *p, size_t l);
+#if HAVE_EXPLICIT_BZERO
+static inline void* explicit_bzero_safe(void *p, size_t l) {
+ if (l > 0)
+ explicit_bzero(p, l);
+
+ return p;
+}
+#else
+void explicit_bzero_safe(void *p, size_t l);
#endif
char *string_erase(char *x);
diff --git a/src/reply-password/reply-password.c b/src/reply-password/reply-password.c
index d085da9f08..122047ffff 100644
--- a/src/reply-password/reply-password.c
+++ b/src/reply-password/reply-password.c
@@ -95,7 +95,7 @@ int main(int argc, char *argv[]) {
r = send_on_socket(fd, argv[2], packet, length);
finish:
- explicit_bzero(packet, length);
+ explicit_bzero_safe(packet, length);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index b227fe3903..5f1c34c841 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -79,7 +79,7 @@ static int retrieve_key(key_serial_t serial, char ***ret) {
if (n < m)
break;
- explicit_bzero(p, n);
+ explicit_bzero_safe(p, n);
free(p);
m *= 2;
}
@@ -88,7 +88,7 @@ static int retrieve_key(key_serial_t serial, char ***ret) {
if (!l)
return -ENOMEM;
- explicit_bzero(p, n);
+ explicit_bzero_safe(p, n);
*ret = l;
return 0;
@@ -124,7 +124,7 @@ static int add_to_keyring(const char *keyname, AskPasswordFlags flags, char **pa
return r;
serial = add_key("user", keyname, p, n, KEY_SPEC_USER_KEYRING);
- explicit_bzero(p, n);
+ explicit_bzero_safe(p, n);
if (serial == -1)
return -errno;
@@ -349,7 +349,7 @@ int ask_password_tty(
if (!(flags & ASK_PASSWORD_SILENT))
backspace_string(ttyfd, passphrase);
- explicit_bzero(passphrase, sizeof(passphrase));
+ explicit_bzero_safe(passphrase, sizeof(passphrase));
p = codepoint = 0;
} else if (IN_SET(c, '\b', 127)) {
@@ -379,7 +379,7 @@ int ask_password_tty(
}
p = codepoint = q == (size_t) -1 ? p - 1 : q;
- explicit_bzero(passphrase + p, sizeof(passphrase) - p);
+ explicit_bzero_safe(passphrase + p, sizeof(passphrase) - p);
} else if (!dirty && !(flags & ASK_PASSWORD_SILENT)) {
@@ -430,7 +430,7 @@ int ask_password_tty(
}
x = strndup(passphrase, p);
- explicit_bzero(passphrase, sizeof(passphrase));
+ explicit_bzero_safe(passphrase, sizeof(passphrase));
if (!x) {
r = -ENOMEM;
goto finish;
@@ -681,7 +681,7 @@ int ask_password_agent(
l = strv_new("", NULL);
else
l = strv_parse_nulstr(passphrase+1, n-1);
- explicit_bzero(passphrase, n);
+ explicit_bzero_safe(passphrase, n);
if (!l) {
r = -ENOMEM;
goto finish;
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index 6c6f3be08c..088abecb7d 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -228,7 +228,7 @@ static int ask_password_plymouth(
r = 0;
finish:
- explicit_bzero(buffer, sizeof(buffer));
+ explicit_bzero_safe(buffer, sizeof(buffer));
return r;
}
@@ -275,7 +275,7 @@ static int send_passwords(const char *socket_name, char **passwords) {
r = (int) n;
finish:
- explicit_bzero(packet, packet_length);
+ explicit_bzero_safe(packet, packet_length);
return r;
}