Расширение Python для Upskirt: мусор в конце строки - PullRequest
2 голосов
/ 29 апреля 2011

Я пытался сделать расширение Python для Upskirt .Я думаю, что это не будет слишком сложно для первого C-проекта, поскольку есть примеры (пример программы в коде Upskirt и расширение Ruby).Я бросаю на это, но иногда в выводе есть какой-то мусор в конце строки.И я не знаю, с чем это связано.

Вот некоторые выводы:

python test.py 
<module 'pantyshot' from '/home/frank/Code/pantyshot/virtenv/lib/python2.7/site-packages/pantyshot.so'>
<built-in function render>

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

Мой код можно найти в моем репозитории Github .Я назвал это pantyshot, потому что я подумал об этом, когда услышал юбку.Странное имя, я знаю.

Надеюсь, кто-нибудь может мне помочь.

1 Ответ

3 голосов
/ 29 апреля 2011

Вы делаете strdup в pantyshot_render:

output_text = strdup(ob->data); /* ob is a "struct buf *" */

Но я не думаю, что ob->data - строка C с нулевым символом в конце. Вы найдете это внутри upskirt/buffer.c:

/* bufnullterm • NUL-termination of the string array (making a C-string) */
void
bufnullterm(struct buf *buf) {
    if (!buf || !buf->unit) return;
    if (buf->size < buf->asize && buf->data[buf->size] == 0) return;
    if (bufgrow(buf, buf->size + 1))
        buf->data[buf->size] = 0; }

Итак, вы, вероятно, бежите от конца буфера и вам повезло, нажав '\0' перед нанесением любого урона. Я думаю, что вы должны вызвать bufnullterm(ob) перед копированием ob->data в виде строки C; или вы можете посмотреть ob->size, использовать malloc и strncpy, чтобы скопировать его, и позаботиться о nul-terminator вручную (но убедитесь, что вы выделяете ob->size + 1 байт для скопированного строка).

И если вы хотите избавиться от новой строки (т. Е. Завершающего \n), то вам, вероятно, придется где-то вручную убирать пробелы.

...