@egorggegor

Почему этот код работает?

Изучаю следующий код:
static ssize_t mydev_write(struct file *filep, const char *buffer, size_t len, loff_t *offset){



   	copy_from_user(ips[i], buffer,256);

   	printk(KERN_INFO "ips: %s \n", ips[i]);

   	i++;

   	if(strncmp(ips[0],"wh",2)==0){

   		BORW=0;

   		int rete1 = nf_register_net_hook(&init_net, &w_drop);

       	if(rete1){

         	printk(KERN_ALERT "FAILED\n");

       	}

   		printk(KERN_INFO "white list\n");

   	}

   	else if(strncmp(ips[0],"bl",2)==0){

   		BORW=1;

   		int rete = nf_register_net_hook(&init_net, &b_drop);

        if(rete){

        	printk(KERN_ALERT "FAILED\n");

        }

   		printk(KERN_INFO "block list\n");

   	}

   	else{

   		BORW=1;

   		int rete = nf_register_net_hook(&init_net, &b_drop);

        if(rete){

        	printk(KERN_ALERT "FAILED\n");

        }

   		printk(KERN_INFO "defult is block list\n");

   	}

    return len;

}


Возник вопрос, почему он работает, и как его можно переписать, чтобы было удобнее читать?

Спасибо за ответы!
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
copy_from_user(ips[i], buffer,256);

   	printk(KERN_INFO "ips: %s \n", ips[i]);
   	i++;

   	if(strncmp(ips[0],"wh",2)==0){

почему он работает,

Во-первых этот код неполный, он использует переменные определённые где-то ещё, от того как именно они определены зависит насколько он "работает".
Во-вторых, по тому что видно, работает он, скажем, так себе:
- он печатает строчку принятую из юзерспейса без ограничения длины. Если юзер не поставил 0-терминатор, то напечатает мусор из пространства ядра за нефиг делать.
- копирование происходит в ips[i], где i увеличивается с каждым вызовом, а анализ всегда смотрит на ips[0].
- в прототипе функции отсутствует аннотация __user у параметра buffer.

как его можно переписать, чтобы было удобнее читать?

Я бы сказал, что его и так удобно читать, особенно если форматирование поправить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Drottarutarnum
Любопытный любитель
Код и так удобно читать, но я бы избавился от if else по возможности

static ssize_t mydev_write(struct file * filep, const char * buffer, size_t len, loff_t * offset) {
	copy_from_user(ips[i], buffer, 256);
	printk(KERN_INFO "ips: %s \n", ips[i]);

	i++;
	if (strncmp(ips[0], "wh", 2) == 0) {
		BORW = 0;
		if (nf_register_net_hook( & init_net, &w_drop) {
			printk(KERN_ALERT "FAILED\n");
		}
		printk(KERN_INFO "white list\n");
		return len;
	}

	if (strncmp(ips[0], "bl", 2) == 0) {
		BORW = 1;
		if (nf_register_net_hook( & init_net, &b_drop)) {
			printk(KERN_ALERT "FAILED\n");
		}
		printk(KERN_INFO "block list\n");
		return len;
	}

	BORW = 1;
	if (nf_register_net_hook( & init_net, &b_drop)) {
		printk(KERN_ALERT "FAILED\n");
	}
	printk(KERN_INFO "defult is block list\n");

	return len;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы