SPV can be well understood if you look at the purpose of having SPV. SPV is created for fast verification of a transaction being in the blockchain. This is useful when a user is only interested in knowing whether a transaction related to him/her is embedded in the blockchain and how much computation power the community has spent after it.
Each block in blockchain is of 1MByte size whereas the block header size is only 80bytes. The total size of all the block header to date is still only a few MBytes which can be easily stored on a mobile device.
In a block, the transactions are tracked in the Merkle tree, where the existence of a transaction can be verified in O(log n) time if the path to the transaction is known. So whenever an SPV client is interested in knowing the existence of a transaction it can download the corresponding block from a full node and then check it.
Now coming to your question
Well, some SPV users have a fraction of the full chain, but some SPV users only have block headers
It depends on whether an SPV has requested for the updated block header from a full node or not.
what does SPV user do with a block when he receives this?
Ideally, it should propagate the block to nodes it is connected to but an SPV can just decide to drop it and do nothing.
Just attach its block header to what the SPV user has at that time?
It can't be done as the block header of the previous block will not match