files: make allowances for 32-bit PIDs

This addresses https://bugs.debian.org/831636 reported by Christoph Biedl.
master
Benno Schulenberg 2016-08-01 15:50:37 +02:00
parent 08c51cfd45
commit 2eafe7bf58
1 changed files with 17 additions and 10 deletions

View File

@ -232,8 +232,7 @@ int write_lockfile(const char *lockfilename, const char *origfilename, bool modi
* byte 0 - 0x62 * byte 0 - 0x62
* byte 1 - 0x30 * byte 1 - 0x30
* bytes 2-12 - program name which created the lock * bytes 2-12 - program name which created the lock
* bytes 24,25 - little endian store of creator program's PID * bytes 24-27 - PID (little endian) of creator process
* (b24 = 256^0 column, b25 = 256^1 column)
* bytes 28-44 - username of who created the lock * bytes 28-44 - username of who created the lock
* bytes 68-100 - hostname of where the lock was created * bytes 68-100 - hostname of where the lock was created
* bytes 108-876 - filename the lock is for * bytes 108-876 - filename the lock is for
@ -248,7 +247,9 @@ int write_lockfile(const char *lockfilename, const char *origfilename, bool modi
lockdata[0] = 0x62; lockdata[0] = 0x62;
lockdata[1] = 0x30; lockdata[1] = 0x30;
lockdata[24] = mypid % 256; lockdata[24] = mypid % 256;
lockdata[25] = mypid / 256; lockdata[25] = (mypid / 256) % 256;
lockdata[26] = (mypid / (256 * 256)) % 256;
lockdata[27] = mypid / (256 * 256 * 256);
snprintf(&lockdata[2], 11, "nano %s", VERSION); snprintf(&lockdata[2], 11, "nano %s", VERSION);
strncpy(&lockdata[28], mypwuid->pw_name, 16); strncpy(&lockdata[28], mypwuid->pw_name, 16);
strncpy(&lockdata[68], myhostname, 31); strncpy(&lockdata[68], myhostname, 31);
@ -318,7 +319,7 @@ int do_lockfile(const char *filename)
if (stat(lockfilename, &fileinfo) != -1) { if (stat(lockfilename, &fileinfo) != -1) {
ssize_t readtot = 0; ssize_t readtot = 0;
ssize_t readamt = 0; ssize_t readamt = 0;
char *lockbuf, *question, *postedname, *promptstr; char *lockbuf, *question, *pidstring, *postedname, *promptstr;
int room, response; int room, response;
if ((lockfd = open(lockfilename, O_RDONLY)) < 0) { if ((lockfd = open(lockfilename, O_RDONLY)) < 0) {
@ -341,18 +342,23 @@ int do_lockfile(const char *filename)
} }
strncpy(lockprog, &lockbuf[2], 10); strncpy(lockprog, &lockbuf[2], 10);
lockpid = (unsigned char)lockbuf[25] * 256 + (unsigned char)lockbuf[24]; lockpid = (((unsigned char)lockbuf[27] * 256 + (unsigned char)lockbuf[26]) * 256 +
(unsigned char)lockbuf[25]) * 256 + (unsigned char)lockbuf[24];
strncpy(lockuser, &lockbuf[28], 16); strncpy(lockuser, &lockbuf[28], 16);
free(lockbuf); free(lockbuf);
pidstring = charalloc(11);
sprintf (pidstring, "%u", (unsigned int)lockpid);
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "lockpid = %d\n", lockpid); fprintf(stderr, "lockpid = %d\n", lockpid);
fprintf(stderr, "program name which created this lock file should be %s\n", lockprog); fprintf(stderr, "program name which created this lock file should be %s\n", lockprog);
fprintf(stderr, "user which created this lock file should be %s\n", lockuser); fprintf(stderr, "user which created this lock file should be %s\n", lockuser);
#endif #endif
/* TRANSLATORS: The second %s is the name of the user, the third that of the editor. */ /* TRANSLATORS: The second %s is the name of the user, the third that of the editor. */
question = _("File %s is being edited (by %s with %s, PID %d); continue?"); question = _("File %s is being edited (by %s with %s, PID %s); continue?");
room = COLS - strlenpt(question) - strlenpt(lockuser) - strlenpt(lockprog) + 3; room = COLS - strlenpt(question) + 7 - strlenpt(lockuser) -
strlenpt(lockprog) - strlenpt(pidstring);
if (room < 4) if (room < 4)
postedname = mallocstrcpy(NULL, "_"); postedname = mallocstrcpy(NULL, "_");
else if (room < strlenpt(filename)) { else if (room < strlenpt(filename)) {
@ -365,11 +371,12 @@ int do_lockfile(const char *filename)
} else } else
postedname = mallocstrcpy(NULL, filename); postedname = mallocstrcpy(NULL, filename);
/* Allow extra space for username (14), program name (8), PID (3), /* Allow extra space for username (14), program name (8), PID (8),
* and terminating \0 (1), minus the %s (2) for the file name. */ * and terminating \0 (1), minus the %s (2) for the file name. */
promptstr = charalloc(strlen(question) + 24 + strlen(postedname)); promptstr = charalloc(strlen(question) + 29 + strlen(postedname));
sprintf(promptstr, question, postedname, lockuser, lockprog, lockpid); sprintf(promptstr, question, postedname, lockuser, lockprog, pidstring);
free(postedname); free(postedname);
free(pidstring);
response = do_yesno_prompt(FALSE, promptstr); response = do_yesno_prompt(FALSE, promptstr);
free(promptstr); free(promptstr);