Editando archivos en uso

Leyendo el manual de rsync(1), en la documentación de la opción --inplace avisa de que:

In-use binaries cannot be updated (either the OS will prevent this from happening, or binaries that attempt to swap-in their data will misbehave or crash).

Resulta que hace un tiempo había intentado hacer un programa que modificara su propio binario para guardar datos (sin ningún motivo concreto), pero resultaba en errores al modificar el propio archivo mientras aún estaba en uso, además es posible (en sistemas POSIX) eliminar archivos en uso. La lectura de la opción de antes encendió una bombilla, he aquí ese programa que modifica su binario para guardar un número, lo hace cargando su propio archivo en memoria, eliminando el archivo y creando uno nuevo... probablemente la localización del punto en memoria se podía hacer de una forma más sofisticada, pero es solo un programilla de prueba.

Pueden dar warning al compilar, memmem parece que no se porta muy bien con los volatile, pero hace falta que esa estructura lo sea para asegurarse de que no queda modificada en las optimizaciones.

selfedit-unlink.c

$ gcc selfedit-unlink.c -o selfedit
selfedit-unlink.c: In function ‘locate_value’:
selfedit-unlink.c:58:5: warning: passing argument 3 of ‘memmem’ discards ‘volatile’ qualifier from pointer target type [enabled by default]
/usr/include/string.h:382:14: note: expected ‘const void *’ but argument is of type ‘volatile char *’
$ ./selfedit 
Stored: 0
$ ./selfedit 7
Stored: 0
$ ./selfedit 
Stored: 7
$ ./selfedit 11
Stored: 7
$ ./selfedit 13
Stored: 11
$ ./selfedit 
Stored: 13
$

Ahora... lo complicado va a ser encontrarle un uso útil :P

CM sin agentes de servidor? Prueba ansible » « Filtración del hostname en HTTPS