El programa se ha probado a ejecutar como un usuario con el id 1000 y con root (id 0). En ninguno de los dos consigo que se escriba de forma correcta. En el primer caso muestra caracteres raros y en el segundo al ser 0 el id de root me parece que lo toma como un caracter de fin de string y no escribe nada.
Código:
LIbreria customfunctions.h
// A function to print an error message and exit
void fatal(char *message) {
char error_message[100];
strcpy(error_message, "[!!] FATAL ERROR ");
strncat(error_message, message, 83);
perror(error_message);
exit(-1);
}
void *ec_malloc(unsigned int size){
void *ptr;
ptr = malloc(size);
if(ptr == NULL)
fatal("in ec_malloc() on memory allocation.\n");
return ptr;
}
void usage(char *prog_name, char *filename){
printf("Usage: %s <text to add to %s>\n", prog_name, filename);
exit(0);
}
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "customfunctions.h"
int main(int argc, char *argv[]){
int userid, fd;
char *databuffer, *notefile;
databuffer = (char *) ec_malloc(sizeof(argv[1]));
strcpy(databuffer, argv[1]);
notefile = (char *) ec_malloc(sizeof("/tmp/note"));
strcpy(notefile, "/tmp/note");
if(argc < 2)
usage(argv[0], notefile);
printf("[DEBUG] buffer @ %p: \'%s\'\n", databuffer, databuffer);
printf("[DEBUG] datafile @ %p: \'%s\'\n", notefile, notefile);
strncat(databuffer, "\n", 1); //Add a newline at the end
fd = open(notefile, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);
if(fd == -1 )
fatal("in main() when opening file");
printf("[DEBUG] file descriptor is %d\n", fd);
userid = getuid(); //Obtiene el id del usuario que lo ejecuta
if(write(fd, &userid, sizeof(int)) == -1 )
fatal("in main() while writing userid to file");
printf("[DEBUG] Address: %p - User id: %i \n", &userid, userid);
if(write(fd, "\n", 1) == -1)
fatal("in main() when writing blank line");
if(write(fd, databuffer, strlen(databuffer)) == -1 )
fatal("in main() when writing in file");
if(write(fd, "\n", 1) == -1)
fatal("in main() when writing blank line");
if(close(fd) == -1)
fatal("in main() when closing file");
free(databuffer);
free(notefile);
return 0;
}
No tengo mucha soltura con gdb pero lo he intentado.
He puesto un breakpoint antes de la linea
if(write(fd, &userid, sizeof(int) == -1)...
Muestro la pila
Código:
(gdb) backtrace full
#0 main (argc=2, argv=0xbffff0c4) at ./notes.c:35
userid = 1000
fd = 3
databuffer = 0x804b008 "test\n"
notefile = 0x804b018 "/tmp/note"
(gdb)
El resultado de la ejecución es el siguiente:
Código:
superdog@ubuntu:~/home/superdog$ cat /tmp/note
�
message
message2
Alguna idea de lo que esta mal?
Thanks.