choom: fix negative adjust score usage

It's really bad idea to use uint64_t (ul_path_write_u64(()) when write
signed number.

Addresses: https://github.com/karelzak/util-linux/issues/723
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2018-12-10 14:26:04 +01:00
parent 88cd3f2256
commit c455cdb30d
3 changed files with 24 additions and 1 deletions

View File

@ -110,6 +110,7 @@ int ul_path_write_string(struct path_cxt *pc, const char *str, const char *path)
int ul_path_writef_string(struct path_cxt *pc, const char *str, const char *path, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
int ul_path_write_s64(struct path_cxt *pc, int64_t num, const char *path);
int ul_path_write_u64(struct path_cxt *pc, uint64_t num, const char *path);
int ul_path_writef_u64(struct path_cxt *pc, uint64_t num, const char *path, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));

View File

@ -850,6 +850,28 @@ int ul_path_writef_string(struct path_cxt *pc, const char *str, const char *path
return ul_path_write_string(pc, str, p);
}
int ul_path_write_s64(struct path_cxt *pc, int64_t num, const char *path)
{
char buf[sizeof(stringify_value(LLONG_MAX))];
int rc, errsv;
int fd, len;
fd = ul_path_open(pc, O_WRONLY|O_CLOEXEC, path);
if (fd < 0)
return -errno;
len = snprintf(buf, sizeof(buf), "%" PRId64, num);
if (len < 0 || (size_t) len >= sizeof(buf))
rc = len < 0 ? -errno : -E2BIG;
else
rc = write_all(fd, buf, len);
errsv = errno;
close(fd);
errno = errsv;
return rc;
}
int ul_path_write_u64(struct path_cxt *pc, uint64_t num, const char *path)
{
char buf[sizeof(stringify_value(ULLONG_MAX))];

View File

@ -74,7 +74,7 @@ static int get_score_adj(struct path_cxt *pc)
static int set_score_adj(struct path_cxt *pc, int adj)
{
return ul_path_write_u64(pc, adj, "oom_score_adj");
return ul_path_write_s64(pc, adj, "oom_score_adj");
}
int main(int argc, char **argv)