2012-04-01 3 views
1

Ich muss einen Gerätetreiber, der eine zufällige Zahl zwischen 1 - 50 zurückgibt und bin verwirrt darüber, wie der Puffer für meinen Gerätetreiber funktioniert, und wie man vorgeht damit es sich wie/dev/random verhält.machen meine eigenen/dev/random, Puffer funktioniert nicht, c

ich machte ein Testprogramm zu sehen, wie/dev/random Werke:

int test_read = open("/dev/random", O_RDONLY); 
int get_random_num(void) { 

    unsigned int random_num; 
    read(test_read, &random_num, sizeof(random_num)); 
    return (random_num % 50) + 1; 
} 

und dann ist die Lesefunktion meines Gerätetreiber (concised Version):

my_random_read(struct file* file, char* buf, 
         size_t count, loff_t* ppos) 
{ 
    unsigned int random_num; 
    get_random_bytes(&random_num, 1); 
    int my_num = 1 + (random_num % 50) 

    int* my_num_pointer = &my_num; 

    copy_to_user(buf, my_num_pointer, count); 
} 

, wenn ich meine laufen Tester auf QEMU ich bekomme -1074311964:/

wie kann ich es so machen, dass alles, was ich tun müsste, ist/dev/random mit/dev/my_random ??

dies ist, wie ich von/dev/my_random gerade lese:

read(test_read, &random_number, sizeof(random_number), 0); 
+1

Ich verstehe die Frage nicht. Sie haben ein Code-Snippet gepostet, dann fragen Sie, wie man '/ dev/random' emuliert, aber Ihr Fragetitel impliziert, dass ein Fehler vorliegt. –

+0

@OliCharlesworth nachdem ich meinen Gerätetreiber kompiliert und geladen habe (woher kommt das Code-Snippet), lese ich aus/dev/my_random und was zurückgegeben wird ist -1074311964. – Tim

Antwort

2
unsigned int random_num; 
get_random_bytes(&random_num, 1); 

Sie get_random_bytes() falsch verwenden. Der zweite Parameter ist die Anzahl der Bytes, nicht Worte:

void get_random_bytes(void *buf, int nbytes) 

Sie weiter privaten Kernel-Speicher zu User-Space Rückkehr:

my_random_read(struct file* file, char* buf, 
         size_t count, loff_t* ppos) 
{ 
    /* ... */ 
    int* my_num_pointer = &my_num; 
    copy_to_user(buf, my_num_pointer, count); 
} 

Sie keine Validierungen auf count durchgeführt haben - - Sie haben hier nur ein, vielleicht zwei Bytes von echten Zufallsdaten. Der Rest der Daten ist Müll-Stack-Daten und Sie haben es hier zum Userspace geleakt. Dies ist eine Sicherheitslücke - der Kernel sollte nicht uninitialisierte Daten in den Benutzerbereich auslaufen. (Es könnte Müll sein, sich darauf zu verlassen, aber ein Angreifer, der nach zehn Seiten Daten von /dev/random fragt, sollte keinen rohen Kernelspeicher bekommen.)

+0

danke für die Antwort. Ich werde versuchen, sizeof() in get_random_bytes verwenden und Anzahl auf 1 begrenzen. – Tim

+0

Sie wollen nicht auch "count" auf "1" begrenzen, da dies nur ein Byte ist. 'sizeof' ist wahrscheinlich die bessere Antwort. – sarnold

+0

ok ich machte die Änderungen und legte ein printk nach: int my_num = 1 + (random_num% 50) und es wird eine Zahl zwischen 1 und 50 ausgedruckt, aber das User Space Tester Programm druckt immer noch Müll wie -1079978156 – Tim