Thumbnail

rani/cscroll.git

Clone URL: https://git.buni.party/rani/cscroll.git

commit a0daeca932a40c97694bc1596ca5f4b275252b29 Author: rani <clagv.randomgames@gmail.com> Date: Thu Jan 12 21:27:14 2023 +0000 Fix segfault when file does not have a known owner diff --git a/include/dir.h b/include/dir.h index d77b5a4..777520c 100644 --- a/include/dir.h +++ b/include/dir.h @@ -517 +517 @@ struct dir_entry_t {   time_t mtime;   long owner;   long group; - int size; + size_t size;   enum f_size u_size;     // oneshot args diff --git a/include/io.h b/include/io.h index 2a94694..82072f6 100644 --- a/include/io.h +++ b/include/io.h @@ -36 +37 @@    #include <stdbool.h>  #include <stdio.h> +#include <sys/types.h>    #include "dir.h"   @@ -746 +759 @@ void resize_fbufcur(long);  void print_oneshot(void);  enum colors get_file_color(struct dir_entry_t *);  char get_file_ident(struct dir_entry_t *); +size_t get_ilen(long, int); +char * get_oname(uid_t); +char * get_gname(gid_t);      extern bool print_path; diff --git a/src/dir.c b/src/dir.c index e02a400..6c19233 100644 --- a/src/dir.c +++ b/src/dir.c @@ -13813 +13822 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {  #else   dir_entry->mtime = buf->st_mtim.tv_sec;  #endif - size_t n; +   dir_entry->owner = buf->st_uid; - if ((n = strlen(getpwuid(buf->st_uid)->pw_name)) > dir_longest_owner) - dir_longest_owner = n;   dir_entry->group = buf->st_gid; - if ((n = strlen(getgrgid(buf->st_gid)->gr_name)) > dir_longest_group) - dir_longest_group = n; + + struct passwd * pw = getpwuid(buf->st_uid); + size_t pw_l = 0; + if (!pw) pw_l = get_ilen(buf->st_uid, 10); + else pw_l = strlen(pw->pw_name); + + struct group * gr = getgrgid(buf->st_gid); + size_t gr_l = 0; + if (!gr) gr_l = get_ilen(buf->st_gid, 10); + else gr_l = strlen(gr->gr_name); + + if (pw_l > dir_longest_owner) dir_longest_owner = pw_l; + if (gr_l > dir_longest_group) dir_longest_group = gr_l;     dir_entry->size = buf->st_size;   dir_entry->u_size = B; diff --git a/src/io.c b/src/io.c index f558667..97a3331 100644 --- a/src/io.c +++ b/src/io.c @@ -1388 +1388 @@ void curses_write_file(struct dir_entry_t * dir_entry, bool highlight) {   char * icon = NULL;  #endif   char * smode = NULL; - char * owner = getpwuid(dir_entry->owner)->pw_name; - char * group = getgrgid(dir_entry->group)->gr_name; + char * owner = get_oname(dir_entry->owner); + char * group = get_gname(dir_entry->group);   char * size = NULL;   char time[128];   @@ -2146 +2149 @@ void curses_write_file(struct dir_entry_t * dir_entry, bool highlight) {     printw("%c %s", f_ident, u_text);   addch('\n'); + + free(owner); + free(group);  }     @@ -5417 +5447 @@ void print_oneshot(void) {   if (n < dir_longest_owner) padstr(dir_longest_owner - n);     // print rest of the long mode info - printf(" %4d %-2s %s %s%s %s%s%c %s\n", + printf(" %4lu %-2s %s %s%s %s%s%c %s\n",   de->size, size, time, fcolor, icon, de->name,   ANSI_RESET, f_ident, u_text);   } @@ -7183 +72143 @@ char get_file_ident(struct dir_entry_t * de) {     return f_ident;  } + + +size_t get_ilen(long i, int base) { + size_t l = 0; + + while (i > 0) { + i /= base; + l++; + } + + return l; +} + + +char * get_oname(uid_t uid) { + char * buf = NULL; + struct passwd * pw = getpwuid(uid); + if (!pw) { + buf = malloc(get_ilen(uid, 10) + 1); + sprintf(buf, "%d", uid); + } else { + buf = malloc(strlen(pw->pw_name) + 1); + strcpy(buf, pw->pw_name); + } + return buf; +} + + +char * get_gname(gid_t gid) { + char * buf = NULL; + struct group * gr = getgrgid(gid); + if (!gr) { + buf = malloc(get_ilen(gid, 10) + 1); + sprintf(buf, "%d", gid); + } else { + buf = malloc(strlen(gr->gr_name) + 1); + strcpy(buf, gr->gr_name); + } + return buf; +}