The FTP updater method is not perfect and sometimes won’t work. It tries to figure it out using what it knows about the WordPress path, as reported by PHP, but symlink trickery can sometimes muck this up.
If you know the paths to the various folders on the server, as seen via your FTP user, you can manually define them in the wp-config.php file.
FTP_BASE is the full path to the “base” folder of the wordpress installation.
FTP_CONTENT_DIR is the full path to the wp-content folder of the wordpress installation.
FTP_PLUGIN_DIR is the full path to the plugins folder of the wordpress installation.
So add these to your wp-config.php file, with the other defines:
define('FTP_BASE','/path/to/wordpress/');
define('FTP_CONTENT_DIR','/path/to/wordpress/wp-content/');
define('FTP_PLUGIN_DIR ','/path/to/wordpress/wp-content/plugins/');
That might help you get it working.
Alternatively, if you control your server, consider switching to suPHP instead of a normal PHP installation. suPHP lets the webserver run as the user who owns the files, allowing WordPress to update itself directly, not needing to do an FTP loopback. Most distributions have suPHP built into their repositories, all you generally have to do is to install it using your package manager.