#include <unistd.h>
#include <string.h>
#include <ctype.h>
+#include <grp.h>
#include <sys/ioctl.h>
-#include "../../udev_utils.h"
-#include "../../logging.h"
-#include "volume_id/volume_id.h"
+#include "../../udev.h"
+#include "libvolume_id/libvolume_id.h"
#define BLKGETSIZE64 _IOR(0x12,114,size_t)
}
#endif
+static void vid_log(int priority, const char *file, int line, const char *format, ...)
+{
+#ifdef USE_LOG
+ va_list args;
+
+ va_start(args, format);
+ log_message(priority, format, args);
+ va_end(args);
+#endif
+ return;
+}
+
static void set_str(char *to, const char *from, size_t count)
{
size_t i, j, len;
/* strip trailing whitespace */
len = strnlen(from, count);
- while (isspace(from[len-1]))
+ while (len && isspace(from[len-1]))
len--;
/* strip leading whitespace */
int i;
uint64_t size;
const char *node = NULL;
+ uid_t nobody_uid;
+ gid_t nobody_gid;
int rc = 0;
logging_init("vol_id");
+ /* hook in our debug into libvolume_id */
+ volume_id_log = vid_log;
+
for (i = 1 ; i < argc; i++) {
char *arg = argv[i];
if (ioctl(vid->fd, BLKGETSIZE64, &size) != 0)
size = 0;
+ dbg("BLKGETSIZE64=%llu", size);
+
+ /* drop all privileges */
+ nobody_uid = lookup_user("nobody");
+ nobody_gid = lookup_group("nogroup");
+ if (nobody_uid > 0 && nobody_gid > 0) {
+ if (setgroups(0, NULL) != 0 ||
+ setgid(nobody_gid) != 0 ||
+ setuid(nobody_uid) != 0) {
+ rc = 3;
+ goto exit;
+ }
+ }
if (volume_id_probe_all(vid, 0, size) == 0)
goto print;
if (print != PRINT_EXPORT)
fprintf(stderr, "%s: unknown volume type\n", node);
- rc = 3;
+ rc = 4;
goto exit;
print:
set_str(name, vid->label, sizeof(vid->label));
+ replace_untrusted_chars(name);
switch (print) {
case PRINT_EXPORT: