2012-06-27 14 views
6

Es simple generar un error de escritura en un conjunto de pruebas escribiendo al /dev/full. ¿Hay una buena técnica para generar un error de lectura? Actualmente estoy usando LD_PRELOAD para anular read, pero parece demasiado complicado y no portátil (no es que/dev/full es portable ...).Genere un error de lectura

+0

Solo un pensamiento, pero ¿qué tal leer de un archivo con las permanentes establecidas en 000? –

+0

@Loadmaster Eso causará un error 'open' en lugar de un error' read'. –

+0

¿Estás después de EINVAL? – jpe

Respuesta

5

Además de la lectura de un directorio (como se menciona en una respuesta anterior) se puede tratar de leer /proc/self/mem para obtener un error (esto debe conseguir que un EIO en Linux) Para obtener una explicación, consulte: https://unix.stackexchange.com/a/6302

+0

Buen truco, pero ten en cuenta que '/ proc/self/mem' solo es bueno si lees desde el principio del archivo. Si el programa busca primero, podría terminar accidentalmente en una zona mapeada. – Gilles

2

De acuerdo con la página de manual (OS X) read (2), read (2) generará un error si "se intenta [n] leer un directorio". Por lo tanto, podría abrir (2) un directorio (asegúrese de que el prot no permita la escritura, o esto arrojará un error) y luego intente leer de él. Parece el único error allí enumerado que podría ocurrir en circunstancias "normales" (es decir, sin hacer algo como romper deliberadamente una estructura FILE *).

Supongo que está hablando de errores de lectura (2) en C o algo así, pero incluso en un lenguaje de nivel superior, es posible que pueda abrir un directorio e intentar leer de él (aunque Acabo de probarlo con Python, y es demasiado inteligente para permitirle abrir el directorio ...)

1

También podría pasar un puntero ilegal como buffer para leer, que devolvería un -EFAULT. algo como:

read(fd, (char *)0, cout); 

Gracias Suzuki

+0

Eso no generará un error de lectura (EINVAL), pero un búfer está fuera de su espacio de direcciones accesible (EFAULT) durante la lectura. Pero según el hombre 2 leído, debería ser posible llegar a EINVAL con una ligera modificación. Pero el punto en la pregunta parece ser "cómo llegar a EINVAL sin modificar el código sino produciendo un contenedor que emulará todas las situaciones de falla interesantes". – jpe

+0

De hecho, el código no debe modificarse y el proceso debe abrir correctamente un archivo, realizar múltiples operaciones de E/S (tanto de lectura como de escritura), pero luego debe fallar alguna operación de lectura posterior. Esto es factible anulando la lectura e implementando un contador simple para que la enésima operación de lectura falle, pero sería bueno hacer algo de un script de shell similar a: 'kill -STOP $ pid; archivo chmod 000; matar -CONT $ pid'.Un método para obtener un error de escritura en condiciones similares sería bueno, ya que la escritura en/dev/completo falla en la primera escritura. –

4

Un enfoque que funciona en todos los principales equipos sería implementar un pequeño sistema de archivos FUSE. EIO es el código de error predeterminado cuando el controlador del sistema de archivos del espacio de usuario hace algo incorrecto, por lo que es fácil de lograr. Tanto los enlaces Perl y Python vienen con ejemplos para comenzar, puede escribir rápidamente un sistema de archivos que en su mayoría refleja los archivos existentes, pero inyecta un EIO en lugares cuidadosamente elegidos.

Existe un sistema de archivos existente: petardfs (article), no sé qué tan bien funciona de la caja.

+0

Oh, +1: petardfs es claramente lo correcto. –

Cuestiones relacionadas