Se ho letto bene nella funzione allocabuffer, allochi un solo byte per pixel, non dovevano essere 3?
EDIT: ok sembra che allochi un solo byte per componente, in questo caso R.

Considera anche che malloc e calloc possone restituire NULL.

EDIT 2: ho trovato l'errore:
Codice PHP:
for(i=0;i<rows*cols*3;i+3/* i NON viene incrementato! */ 
devi scrivere così:

Codice PHP:
for(i=0;i<rows*cols*3;i+=3/* i viene incrementato" */ 
oppure:

Codice PHP:
for(i=0;i<rows*cols*3;i=i+3/* i  viene incrementato" */